perm filename GEM.WRU[0,BGB] blob
sn#111627 filedate 1974-07-12 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00014 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE PAGE & CONTENTS. AUGUST 1974
C00006 00003 1.0 INTRODUCTION TO GEOMEL, GEOMES and MESGEM.
C00010 00004 1.1 GEOMES PRIMER. Geometric Modeling Embedded in SAIL.
C00014 00005
C00017 00006 1.2 MESGEM PRIMER. Message Procedure Geometric Modeling.
C00019 00007 2.0 MEMORY, CONTROL, INPUT AND OUTPUT ROUTINES.
C00021 00008 3.0 DATUM AND LINK NAMES.
C00023 00009 4.0 WINGED EDGE PRIMITIVES.
C00027 00010 4.0 EULER MAKE PRIMITIVES.
C00029 00011 5.0 EULER KILL PRIMITIVES.
C00032 00012 6.0 EUCLIDEAN TRANSFORMATIONS.
C00036 00013 7.0 IMAGE FORMING ROUTINES.
C00038 00014 9.0 Description of GEOMED Source Code.
C00041 ENDMK
C⊗;
TITLE PAGE & CONTENTS. AUGUST 1974
GEOMED AS A GEOMETRIC MODELING SYSTEM.
BRUCE G. BAUMGART
ABSTRACT: The subroutines under GEOMED are presented as a modeling
system accessible from LISP, SAIL and SAIL message procedures.
_______________________________________________________________________________
1.0 Introduction to GEOMEL, GEOMES, MESGEM and CRE.
1.1 GEOMES PRIMER. Geometric Modeling Embedded in SAIL.
1.2 MESGEM PRIMER. Message Procedure Geometric Modeling.
1.3 GEOMEL PRIMER. Geometric Modeling Embedded in LISP.
1.4 CRE PRIMER. Contour Region Edge image processing.
1.5 Auxillary Programs: XIP, XAP, FILMED, BLOWUP, MKVID and DDVID.
2.0 Memory, Control, Input and Output Routines.
GEOMED MKUNIV MKNODE KLNODE
MKWORLD MKCAMERA MKWINDOW
OUTB3D OUTGEM OUTCAM OUTVID PLOTO
INB3D INGEM INCAM INCRE
3.0 Datum and Link Names:
XWC YWC ZWC AA BB CC XPP YPP ZPP
IX IY IZ JX JY JZ KX KY KZ
NFACE PFACE NED PED NVT PVT DAD SON BRO SIS
ALT ALT2 CW CCW CAR8 CDR8
4.0 Winged Edged Primitives:
MKB MKF MKE MKV MKFRAME
WING INVERT EVERT
ECW ECCW OTHER VCW VCCW FCW FCCW
BDET BATT BGET
5.0 Euler Routines:
MKBFV MKEV ESPLIT MKFE GLUEE
KLBFEV KLFE KLEV UNGLUE
GLUE MKCOPY SWEEP ROTCOM PYRAMID FVDUAL
MKCUBE MKCYLN MKBALL
BIN BUN BSUB MKCVEX
MKBUCK ECUT FCUT BCUT
6.0 Euclidean Routines:
TRANSL ROTATE SHRINK APTRAN INTRAN DISTANCE
NORM MKROT1 ORTHO1 ORTHO2 DETERM ANGL3V
7.0 Image Forming Routines:
GEODPY IIIDPY SHOW1 SHOW2 SHOW3 SHOW4
TAKE1 TAKE2 OCCULT SHADOW CLIPER
VPROJ UNPROJ FACOEF ECOEF
8.0 Arithmetic and Display Routines:
PI SQRT LOG SIN COS ATAN ATAN2 ASIN ACOS
DPYBUF DPYSST DPYSET DPYBIG DPYBRT
AVECT AIVECT RVECT RIVECT DPYOUT
9.0 Description of GEOMED Source Code.
1.0 INTRODUCTION TO GEOMEL, GEOMES and MESGEM.
GEOMED is implemented in PDP-10 machine code and is composed
of about 250 modeling subroutines. These subroutines are SAIL and
LISP accessible depending on how they are assembled and loaded. When
assembled and load for SAIL, the GEOMED subroutines are called GEOMES
for "Geometric Modeling Embedded in SAIL"; when the routines are
assembled and loaded for LISP, they are referred to as GEOMEL
standing for "Geometric Modeling Embedded in LISP".
Strictly defined, I intended to use the name "GEOMED" only
for the editor itself and to call the larger project "GEM" for
Geometric Modeling; however this has not caught on, and so the reader
is warned that the named "GEOMED" may refer to either the interactive
drawing program or to other entities including GEOMEL, GEOMES,
MESGEM, the data structures, the command languages, and so on.
As a graphics language, GEOMED is all semantics with no
syntax of its own. The subroutines take from one to four arguments,
return one or no values, and usually have considerable side effects
on the data structures. Unless otherwise noted, all arguments and
values are integers; subroutines executed only for effect tend to
return integer value zero.
The GEOMED data structure is implemented as twelve word
blocks containing pointers and data in the fashion usual to graphics
and simulation; an introduction to this technology can be found in
Knuth (volume I, chapter 2). The twelve word blocks are called
"nodes". Nodes are referred to by their actual machine address in the
user core image, which is an integer called a "link". Subroutines
that take nodes as arguments or return nodes as values pass links
rather than the nodes themselves. In SAIL, the user core image can
be accessed as a special array named MEMORY.
1.1 GEOMES PRIMER. Geometric Modeling Embedded in SAIL.
The first example GEOMES program, immediately below, creates
two cubic prisms and displays them rotating. The header file,
GEOMES.HDR, is kept on the disk area [GEM,HE] and contains the names
of the necessary load modules, the declarations of all the modeling
routines and SAIL macros for accessing GEOMED data structures. I
would strongly advise the user to study a copy of the header for it
is necessarily the most accurate index of the modeling routines.
After the header, the first routine to execute must be MKUNIV
(make universe), which initialize the modeling data structures. In
the example, two blocks are created using the MKCUBE routine which
takes three arguments: width, breadth and height of a rectangular
parallelepiped. All creation routines return an integer which is the
absolute machine address of the GEOMED node of the entity created.
(GEOMED data structures have absolutely nothing to do with LEAP).
The next routine used is GEODPY which refreshs the display of
the model using the default parameters or GEOMED. (See SHOW1 and
SHOW2 for more flexible display refresh routines). Finally, the
example calls TRANSL and ROTATE which perform the the Euclidean
transformations translation and rotation. TRANSL takes four argument:
first the thing to be moved followed by the three components of a
translation vector; similarly ROTATE takes four arguments: first the
thing to be moved followed by the three components of a rotation
vector.
-------------------------------------------------------------------------------
BEGIN "EXAMPLE1"
REQUIRE "GEOMES.HDR[GEM,HE]" SOURCE_FILE;
DEFINE π="3.1415927";
INTEGER B1,B2;
MKUNIV;
B1 ← MKCUBE(2,4,8);
B2 ← MKCUBE(1,2,4);
TRANSL(B2,-2,2,0);
WHILE TRUE DO
BEGIN
GEODPY;
ROTATE(B1,π/10,π/12,π/13);
ROTATE(B2,-π/14,π/16,-π/17);
END;
END "EXAMPLE1";
-------------------------------------------------------------------------------
Now read Example #2, immediately below. In this example the
model of the yellow arm is read in and the first three joints are run
through a simulated arm motion. The routine INB3D reads B3D
polyhedra files. The FDNAME, find name, routine searchs for GEOMED
body print names, FDNAME returns zero when a name is not found. The
routine INCAM reads in a camera file. Finally, the routine SHOW2
calls the hidden line eliminator; leaving the SHOW2 arguments zero
causes default parameters to be used.
-------------------------------------------------------------------------------
BEGIN "EXAMPLE2"
REQUIRE "GEOMES.HDR" SOURCE_FILE;
DEFINE α="COMMENT";
INTEGER B1,B2,J1,J2,J3,J4,J5,J6,C1,CHR,I;
MKUNIV;GEODPY;
B1 ← INB3D("ARM[DAT,BGB]"); α MODEL OF THE YELLOW ARM;
B2 ← INB3D("TABLE[DAT,BGB]"); α MODEL OF THE HAND/EYE TABLE;
J1 ← FDNAME("JOINT1"); α SHOULDER - ABOUT VERTICAL;
J2 ← FDNAME("JOINT2"); α ARM - ABOUT HORIZONTAL;
J3 ← FDNAME("JOINT3"); α SLIDE;
J4 ← FDNAME("JOINT4"); α WRIST TWIST;
J5 ← FDNAME("JOINT5"); α WRIST FLAP;
J6 ← FDNAME("JOINT6"); α HAND
C1 ← INCAM("ARMCAM[DAT,BGB]");
SHOW2(0,0); α HIDDEN LINE ELIMINATION;
FOR I←0 THRU 70 DO
BEGIN
ROTATE(-J1,0,0,π/18);
ROTATE(-J2,0,0,π/20);
TRANSL(-J3,0,0,0.1);
SHOW2(0,0);
END;
END "EXAMPLE2"
-------------------------------------------------------------------------------
1.2 MESGEM PRIMER. Message Procedure Geometric Modeling.
The message procedure modeling routines are declared by the
source file MESGEM.HDR[GEM,HE] which should be used in place of
GEOMES.HDR[GEM,HE]. Almost all the subroutine and link names of
MESGEM are the same as in GEOMES, however the user will have to load
his program with GLBLOW from SYS.
1.3 GEOMEL PRIMER. Geometric Modeling Embedded in LISP.
A dump version of GEOMEL is available on [GEM,HE] and the
LISP is a current version UCI LISP.
1.4 CRE PRIMER. Contour Region Edge image processing.
1.5 Auxillary Programs: XIP, XAP, DDVID, BLOWUP & CINEMA.
XIP and XAP are explained somewhat by the document XAP.BGB[UP,DOC].
2.0 MEMORY, CONTROL, INPUT AND OUTPUT ROUTINES.
top of stack ← GEOMED; Geometric Editor.
univer ← MKUNIV; Make universe, initialization.
node ← MKNODE(word0); Make node with given type bits.
KLNODE(QNODE); Kill node.
The routine named GEOMED, passes control to the geometric
editor, which enters the jump table command scanner described in the
A.I. memo #232. When the exit command "εE" is given, GEOMED returns
the the address of the node which is at the top of its stack (or
zero, if the stack is empty). MKUNIV; initializes GEOMED node
space. QNODE ← MKNODE(Q); takes a node from the empty node list;
memory space is requested from SAIL or LISP as needed. The integer Q
is stored in the TYPE bits (word zero) of the newly created node.
KLNODE(QNODE); returns a node to the empty node list.
The following routines
OUTB3D(filename,BODY);
OUTGEM(filename,BODY);
OUTCAM(filename);
OUTV2D(filename);
body ← INB3D(filename);
body ← INGEM(filename);
camr ← INCAM(filename);
body ← INCRE(filename);
3.0 DATUM AND LINK NAMES.
Datum names: XWC YWC ZWC World Coordinates Locus.
XPP YPP ZPP Perspective Projected Locus.
AA BB CC KK Face or Edge Coefficients.
IX IY IZ I-unit vector of a frame.
JX JY JZ J-unit vector of a frame.
KX KY KZ K-unit vector of a frame.
The above datum names all refer to real numbers. In GEOMES,
the datum names are defined as MEMORY array references and so can
appear on the left of a left arrow. In GEOMEL, eighteen
corresponding datum store routines are provided; for example:
XWC.(Xvalue,Vertex), will store a new X coordinate value into a
vertex node.
Link names: NFACE PFACE Face Ring.
NED PED Edge Ring.
NVT PVT Vertex Ring.
DAD SON Parts Tree Links.
BRO SIS Parts Tree Links.
ALT ALT2 GEOMED Temporaries.
CW CCW Body ring of world.
CAR8 CDR8 User Links.
In both GEOMES and GEOMEL, the links may be modified by the
two argument subroutines of the same name with a period "." suffixed
to it for LISP or a dollar sign suffixed for SAIL. For example,
ALT$(Q,E) will place the link (or integer value) Q into the ALT
halfword link position of the node E.
4.0 WINGED EDGE PRIMITIVES.
4.1 NODE MAKERS.
body ← MKB(world or 0)
face ← MKF(body)
edge ← MKE(body)
vertex ← MKV(body)
frame ← MKFRAME;
MKB makes a body node and place it in the body ring of the
given world (or in the now world if the given world argument is
zero). MKF, MKE and MKV make a face, edge or vertex node respectively
and place it in the proper given body's face, edge or vertex ring.
MKFRAME simply returns a frame node with a unit rotation matrix and
zero world locus.
4.2 WING LINK MUNGING.
WING(edge1,edge2);
INVERT(edge);
EVERT(body);
Given that each edge has its proper two vertices and two
faces, WING(E1,E2) will make the edges point at each other in the
correct orientation. INVERT(edge) will flip the linear orientation of
an edge. EVERT(body) will flip the surface orientation of a body,
making solids into holes and vise versa.
4.3 FACE AND VERTEX PERIMETER ACCESSING.
next cw edge ← ECW(edge,face or vertex);
next ccw edge ← ECCW(edge,face or vertex);
cw vertex ← VCW(edge,face);
ccw vertex ← VCCW(edge,face);
cw face ← FCW(edge,vertex);
ccw face ← FCCW(edge,vertex);
face or vertex ← OTHER(edge,face or vertex);
ECW(E,FV) and ECCW(E,FV) fetch the next edge clockwise or
counter clockwise from the given edge about the given face or vertex.
VCW(edge,face) and VCCW(edge,face) fetch the next vertex clockwise or
counter clockwise from the given edge with repect to the given face.
FCW(edge,vertex) and FCCW(edge,vertex) fetch the next face clockwise
or counter clockwise from the given edge with repect to the given
vertex. The OTHER(<edge>,<face|vertex>) will fetch the face or vertex
of the given edge which is not equal to the given face or vertex.
4.3 PARTS TREE AND BODY GET.
BDET(body);
BATT(body1,body2);
body ← BGET(face or edge or vertex);
BDET(body) will detach a body from the parts tree.
4.0 EULER MAKE PRIMITIVES.
4.1 BNEW ← MKBFV; Make vertex polyhedron.
4.2 VNEW ← MKEV(F,V); MAKES NEW EDGE AND VERTEX SUCH THAT:
VNEW = NVT(ENEW); V = PVT(ENEW);
VNEW ← ESPLIT(E); MAKES NEW EDGE AND VERTEX...
4.3 ENEW ← MKFE(V1,F,V2); MAKES NEW FACE AND EDGE SUCH THAT:
FNEW = NFACE(ENEW); F = PFACE(ENEW);
V1 = PVT(ENEW); V2 = NVT(ENEW).
4.4 ENEW ← GLUEE(F1,V1,F2,V2); MAKES NEW EDGE, KILLS F2,
AND MAKES A HOLE OR KILLS A BODY.
V1 = PVT(ENEW); V2 = NVT(ENEW).
4.2 VNEW ← MKEV(FACE,VERTEX);
VNEW ← ESPLIT(EDGE);
Make a new edge and a new vertex in the given FACE from the
given VERTEX; the new vertex is return, VNEW; the new edge can be
accessed by taking PED(VNEW).
ESPLIT, makes a new edge and a new vertex, VNEW; the new edge may be
obtained by taking PED(VNEW); the new edge is place between VNEW and
PVT(EDGE).
4.3 ENEW ← MKFE(V1,FACE,V2);
Make a new face and a new edge by joining V1 and V2 of FACE.
The new edge is returned, ENEW; the new face may always be obtained
by taking NFACE(ENEW).
5.0 EULER KILL PRIMITIVES.
5.1 QNEW ← KLBFEV(Q); Kill entity.
5.2 F ← KLFE(E); Kill E and NFACE(E), return PFACE(E).
5.3 E ← KLEV(V); Kill V and PED(V), return other E of V.
V ← KLEV(E); Kill E and NVT(E), retirn PVT(E).
5.4 FNEW ← UNGLUE(E); Undo an GLUEE.
.....................................................................
6.0 EASY POLYHEDRON ROUTINES.
body ← GLUE(face1,face2); Glue face-face.
qnew ← MKCOPY(entity); Make copy.
face ← SWEEP(face,flag); Sweep cylinder.
face ← ROTCOM(face); Rotation completion.
peak ← PYRAMID(fv); Make pyramid on a face (or vertex).
body ← FVDUAL(body); Make face/vertex dual of a body.
bnew ← MKCUBE(dx,dy,dz); Make right rectangular prism.
bnew ← MKCYLN(radius,n,dz); Make right cylinder.
bnew ← MKBALL(radius,m,n; Make sphere approximation.
MKCUBE(dx,dy,dz) creates and returns a cubic right prism.
MKCYLN(r,n,z) creates and returns a regular N-sided right prism.
bnew ← BIN(body1,body2); Body intersection.
bnew ← BUN(body1,body2); Body union.
bnew ← BSUB(body1,body2); Body subtraction.
MKCVEX(body or face); Make convex faces.
6.0 EUCLIDEAN TRANSFORMATIONS.
Euclidean Transformations with respect to world frame:
TRANSL(object,dx,dy,dz);
ROTATE(object,wx,wy,wz);
SHRINK(object,sx,sy,sz);
Euclidean Transformations with respect to objects own frame:
TRANSL(-object,dx,dy,dz);
ROTATE(-object,wx,wy,wz);
SHRINK(-object,sx,sy,sz);
Euclidean Transformations with respect to arbitrary frame:
TRANSL(XWD(frame,object),dx,dy,dz);
ROTATE(XWD(frame,object),wx,wy,wz);
SHRINK(XWD(frame,object),sx,sy,sZ);
Make Euclidean Transformation
tran ← TRANSL(0,dx,dy,dz);
tran ← ROTATE(0,wx,wy,wz);
tran ← SHRINK(0,sx,sy,sz);
OBJECT ← APTRAN(OBJECT,TRAN);
FRAME ← INTRAN(FRAME);
Z ← DISTANCE(BFEV1,BFEV2);
NORM
MKROT1
ORTHO1(FRAME)
ORTHO2(FRAME)
Z ← DETERM(FRAME)
ANGL3V(V1,V2,V3)
7.0 EUCLIDEAN TRANSFORMATIONS.
When the ENTITY argument is non-zero, these subroutines
perform the indicated Euclidean Transformation: translation,
rotation, dilation and reflection. When the ENTITY argument is ZERO,
then a FRAME node representing the desired transformation is
returned.
FRAMES and EUCLIDEAN TRANSFORMATIONS
A frame node has two intrepretations: it may be used to
represent a frame of reference or it may be used to specify a
Euclidean transformation.
As a frame of reference the XWC, YWC, ZWC datums contain the
location of the origin of the frame in world coordinates; and the
remaining nine datums IX,IY,IZ, JX,JY,JZ, KX,KY,KZ are the components
of three unit vectors I, J, and K that determine a right handed
rectangular Cartesian coordinate system. The nine components of the
unit vectors form an orthonormal rotation matrix.
As a Euclidean transformation, the frame is applied to the
3-D world coordinates of an entity Q to make new coordinates.
---------------------------------------------------------------------
| APTRAN's inner most subroutine. |
| Expects arguments in V and Q. Clobbers 1,2,X,Y,Z. |
| |
| X ← XWC(V); |
| Y ← YWC(V); |
| Z ← ZWC(V); |
| |
| XWC(V) ← X*IX(Q) + Y*JX(Q) + Z*KX(Q) + XWC(Q); |
| YWC(V) ← X*IY(Q) + Y*JY(Q) + Z*KZ(Q) + YWC(Q); |
| ZWC(V) ← X*IZ(Q) + Y*JZ(Q) + Z*KZ(Q) + ZWC(Q); |
---------------------------------------------------------------------
HOMOGENEOUS COORDINATES (LACK OF...)
The interpretation of frame nodes can be given in the
four by four notation of homogeneous coordinates.
7.0 IMAGE FORMING ROUTINES.
GEODPY; GEOMED's display refresh.
SHOW1(window,glass); Display all edges.
SHOW2(window,glass); Display visible edges only.
SHOW3(window,glass); Display all visible faces.
8.0 ARITHMETIC AND DISPLAY ROUTINES.
SQRT LOG SIN COS ATAN ATAN2 ASIN ACOS PI
DPYSET DPYBIG DPYBRT DPYSST
AVECT AIVECT RVECT RIVECT DPYOUT
The usual arithmetic and display routines used at Stanford
are embedded in GEOMED; so that the typical user should not require
SAITRG or DISPLY or any of their equivalents. The next paragraph is a
short explanation of the display functions, which are similar to
those document in DISPLY.RBN[UP,DOC]@SAIL.
The CRT display screens are refreshed by a special purpose
display computer which executes a display file from core memory. With
the exception of DPYSET and DPYOUT; all of the diaplay subroutines
add display code to the display file. The display screen has 1024 by
1024 visible addressible positions with the origin in the center of
the screen, the positive X-axis to the right and the positive Y-axis
upwards. Thus display coordinates may range from -512 to +511;
9.0 Description of GEOMED Source Code.
The overall structure of GEOMED is determined by the urge to
have approximately one subroutine per page of source code. The
subroutine calling conventions are SAIL like; accumulator 17 (17
octal of course !) is named "P" and is used as a pushdown list for
arguments and return addresses. The subroutine calling sequence goes:
PUSH P,ARG↔ PUSH P,ARG↔ ... PUSHJ P,SUBR and a subroutine return must
fix up the stack SUB P,[XWD N+1,N+1] and JRST @N+1(P).
The somewhat unusal appearance of GEOMED machine code arises
from the use of FAIL assembler macros to implement ALGOL like
subroutine notation and KNUTH like datum/link notation; and from the
use of double-arrow "↔" to place more than one machine instruction
per line and the use of seven alternate PDP-10 mnemonics.
The seven alternate PDP-10 mnemonics are LAC, DAC, CAR, CDR,
DIP, DAP and GO for MOVE, MOVEM, HLRZ, HRRZ, HRLM, HRRM and JRST
respectively. The LAC, DAC, DIP, DAP come from PDP-1 nomensclature
and are shorter and more pronoucible than their PDP-10 equivalents.
The CAR and CDR are from LISP which got them from the IBM-709. The
GO comes from ALGOL and is shorter and more descriptive than JRST.
The PDP-10 op code names sacrifice pronoucibility for systematic
nomensclature; and although I once proposed having alternate concise
euphonious names for the most frequently used operations; the idea
was quite unpopular and so I have abandoned it for all except the
above seven mnemonics.